#ifndef CARACTERISTIQUE_H
#define CARACTERISTIQUE_H 1

#include <iostream>

using namespace std;

class FlotMessage;

/**
 * Classe qui permet de se simplifier la vie pour la gestion des
 * traits. En effet ici on stocke une valeur énumérée (qui va de 0 à
 * 6, pour les six traits différent et le score de force
 * exceptionnelle) pouvant être utilisée comme un entier positif (donc
 * comme un indice) ou une string pour l'affichage.
 *
 * @author Johan "Solo" Luisier
 */
class Caracteristique
{
protected:
  /**
   * Enumère les différents caracteristiques existantes. Une septième
   * a été ajouté à la liste traditionnelle pour gérer la force
   * exceptionnelle.
   */
  enum enumCaracteristique
    {
      For  = 0, /**< Correspond à la force. */
      Dex  = 1, /**< Correspond à la dextérité. */
      Cons = 2, /**< Correspond à la constitution. */
      Int  = 3, /**< Correspond à l'intelligence. */
      Sag  = 4, /**< Correspond à la sagesse. */
      Char = 5, /**< Correspond au charisme. */
      Exc  = 6  /**< Correspond au score de force exceptionnelle. */
    };
  /**
   * Numéro de la caracteristique de l'instance courante.
   */
  enumCaracteristique Valeur;
public:
  Caracteristique(const enumCaracteristique& caracteristique = For);
  Caracteristique(const unsigned& caracteristique);
  ~Caracteristique();
  void setValeur(const enumCaracteristique& caracteristique);
  void setValeur(const unsigned& caracteristique);
  friend ostream& operator<<(ostream& os,
			     const Caracteristique& caracteristique);
  friend FlotMessage& operator<<(FlotMessage& os,
				 const Caracteristique& caracteristique);
  unsigned valeur() const;
  operator unsigned() const;
};

#endif // CARACTERISTIQUE_H
